// UVa101 The Blocks Problem
// 刘汝佳
#include <bits/stdc++.h>
using namespace std;
const int NN = 30;
int N;
using VI = vector<int>;
VI pile[NN];
// 找木块a所在的pile和height，以引用的形式返回调用者
int find_block(int a, int& h) {
  int p = -1;
  for (p = 0; p < N; p++)
    for (h = 0; h < pile[p].size(); h++)
      if (pile[p][h] == a) return p;
  return -1;
}

// 把第p堆高度为h的木块上方的所有木块移回原位
void clear_above(int p, int h) {
  VI& s = pile[p];
  for (size_t i = h + 1; i < s.size(); i++)
    pile[s[i]].push_back(s[i]);  // 把木块b放回原位
  s.resize(h + 1);               // pile只应保留下标0~h的元素
}

// 把第p堆高度h及其上方的木块整体移动到p2堆的顶部
void pile_onto(int p, int h, int p2) {
  vector<int>& s = pile[p];
  for (size_t i = h; i < s.size(); i++) pile[p2].push_back(s[i]);
  s.resize(h);
}

void print() {
  for (int i = 0; i < N; i++) {
    printf("%d:", i);
    for (int x : pile[i]) printf(" %d", x);
    printf("\n");
  }
}

int main() {
  int a, b;
  cin >> N;
  string s1, s2;
  for (int i = 0; i < N; i++) pile[i].push_back(i);
  while (cin >> s1 >> a >> s2 >> b) {
    int pa, pb, ha, hb;
    pa = find_block(a, ha), pb = find_block(b, hb);
    if (pa == pb) continue;  // 非法指令
    if (s2 == "onto") clear_above(pb, hb);
    if (s1 == "move") clear_above(pa, ha);
    pile_onto(pa, ha, pb);
  }
  print();
  return 0;
}
/*
  算法分析请参考: 《入门经典-第2版》例题5-2。
  注意vector::size()的返回值是size_t而不是int
  同类题目:
  Alignment of Code, ACM/ICPC NEERC 2010, UVa1593
  Ducci Sequence, ACM/ICPC Seoul 2009, UVa1594
*/
// 24455363 101 The Blocks Problem  Accepted  C++11 0.000 2020-01-22 08:28:55